package com.zhanghp.class026;

import java.util.PriorityQueue;
import java.util.TreeMap;
import java.util.TreeSet;

/**
 * @author zhanghp
 * @since 2024/3/27 15:08
 */
public class Code02_TreeSetAndTreeMap {

    public static void main(String[] args) {
        // 底层红黑树
        TreeMap<Integer, String> treeMap = new TreeMap<>();
        treeMap.put(5, "这是5");
        treeMap.put(7, "这是7");
        treeMap.put(1, "这是1");
        treeMap.put(2, "这是2");
        treeMap.put(3, "这是3");
        treeMap.put(4, "这是4");
        treeMap.put(8, "这是8");

        // true
        System.out.println(treeMap.containsKey(1));
        // false
        System.out.println(treeMap.containsKey(10));
        treeMap.put(4, "张三是4");
        // 张三是4
        System.out.println(treeMap.get(4));
        treeMap.remove(4);
        // true
        System.out.println(treeMap.get(4) == null);

        // 1
        System.out.println(treeMap.firstKey());
        // 8
        System.out.println(treeMap.lastKey());
        // 3 TreeMap中，所有的key，<= 4且最近的key是什么
        System.out.println(treeMap.floorKey(4));
        // 5 TreeMap中，所有的key，>= 4且最近的key是什么
        System.out.println(treeMap.ceilingKey(4));

        System.out.println("======treeSet======");
        TreeSet<Integer> set = new TreeSet<>();
        set.add(3);
        set.add(3);
        set.add(4);
        set.add(4);
        // 2
        System.out.println(set.size());
        while (!set.isEmpty()) {
            // 3 4
            System.out.print(set.pollFirst() + " ");
            // 4 3
//            System.out.print(set.pollLast() + " ");
        }
        System.out.println();
        // 堆，默认小跟堆，如果要大根堆，定制比较器
        PriorityQueue<Integer> heap = new PriorityQueue<>();
        heap.add(3);
        heap.add(3);
        heap.add(4);
        heap.add(4);

        // 4
        System.out.println(heap.size());
        // 3 3 4 4
        while (!heap.isEmpty()) {
            System.out.print(heap.poll() + " ");
        }

        System.out.println();

        // 定制的大根堆，用比较器！

        PriorityQueue<Integer> heap2= new PriorityQueue<>((a, b) -> b-a);
        heap2.add(3);
        heap2.add(3);
        heap2.add(4);
        heap2.add(4);
        // 4
        System.out.println(heap2.size());
        // 4 4 3 3
        while (!heap2.isEmpty()) {
            System.out.print(heap2.poll() + " ");
        }
        System.out.println();
    }
}
